package com.company.ljh.medium;

/**
 * @description:
 * LCR 090. 打家劫舍 II
 * 已解答
 * 中等
 * 相关标签
 * 相关企业
 * 一个专业的小偷，计划偷窃一个环形街道上沿街的房屋，每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ，这意味着第一个房屋和最后一个房屋是紧挨着的。同时，相邻的房屋装有相互连通的防盗系统，如果两间相邻的房屋在同一晚上被小偷闯入，系统会自动报警 。
 *
 * 给定一个代表每个房屋存放金额的非负整数数组 nums ，请计算 在不触动警报装置的情况下 ，今晚能够偷窃到的最高金额
 * @projectName:leet_code
 * @see:com.company.ljh.medium
 * @author:ljh
 * @createTime:2024/3/24 21:22
 * @version:1.0
 */
public class 打家劫舍II {
    public int rob(int[] nums) {
        if(nums.length < 2){
            return nums[0];
        }
        if(nums.length < 3){
            return Math.max(nums[0],nums[1]);
        }
        int dp[] = new int[nums.length-1];
        //递推公式dp[i] = max(dp[i-2]+i,dp[i-1])
        dp[0] = nums[0];
        dp[1] = Math.max(nums[1],dp[0]);
        //两种情况，一个是偷第一家，不偷最后一家
        for(int i = 2;i < nums.length - 1;i++){
            dp[i] = Math.max(dp[i-2]+nums[i],dp[i-1]);
        }
        int max1 = dp[nums.length - 2];

        //不偷第一家
        dp[0] = nums[1];
        dp[1] = Math.max(nums[2],dp[0]);
        for(int i = 2;i < nums.length - 1;i++){
            dp[i] = Math.max(dp[i-2]+nums[i+1],dp[i-1]);
        }
        int max2 = dp[nums.length - 2];
        return Math.max(max1,max2);
    }
}
